#1062 Fix core dump when merging tracks with disparate IGC extensions (#1063)
authorPacketFiend <kenneth@voort.ca>
Wed, 12 Apr 2023 12:51:32 +0000 (08:51 -0400)
committerGitHub <noreply@github.com>
Wed, 12 Apr 2023 12:51:32 +0000 (06:51 -0600)
* #1062 Fix core dump when merging tracks with disparate IGC extensions

* Reduce `value` variable scope when writing SimpleArrays

* Debug oopsie bugfix, fix core dump when merging IGC files with no extensions

* Collapse redundant if statement

* Fix brain fart

* Eliminate igc_fsdata::has_value()

kml.cc

diff --git a/kml.cc b/kml.cc
index faa550abdcdb15721d14bdfee4cebabe10d190d6..978b88071b27098765f8f5f1adcf7f16e8e8c542 100644 (file)
--- a/kml.cc
+++ b/kml.cc
@@ -1505,14 +1505,22 @@ void KmlFormat::kml_mt_simple_array(const route_head* header,
     case wp_field::igc_fxa:
     case wp_field::igc_gfo:
     case wp_field::igc_siu:
-    case wp_field::igc_acz: {
-      double value = fs_igc->get_value(member).value();
-      if (global_opts.debug_level >= 6) {
-        printf(MYNAME ": Writing KML SimpleArray data: %s of %f\n", name, value);
+    case wp_field::igc_acz:
+      if (fs_igc && fs_igc->get_value(member).has_value()) {
+        double value = fs_igc->get_value(member).value();
+        if (global_opts.debug_level >= 6) {
+          printf(MYNAME ": Writing KML SimpleArray data: %s of %f\n", name, value);
+        }
+        writer->writeTextElement(QStringLiteral("gx:value"), QString::number(value));
+      // No igc_fsdata present, but we still need to write out the SimpleArray.
+      // This can happen when merging tracks with different sets of IGC extensions.
+      } else {
+        if (global_opts.debug_level >= 7) {
+          printf(MYNAME ": Writing empty KML SimpleArray data for %s\n", name);
+        }
+        writer->writeTextElement(QStringLiteral("gx:value"), QString());
       }
-      writer->writeTextElement(QStringLiteral("gx:value"), QString::number(value));
       break;
-    }
     default:
       fatal("Bad member type");
     }